﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Tecnopez.Globals;
using BussinessLogicTecnoPez.AtencionCliente.Pedido;
using BussinessLogicTecnoPez.Tipos_Comunes;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;
using BussinessLogicTecnoPez.AtencionCliente.Cliente;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.Utils;
using BussinessLogicTecnoPez.Produccion.Producto;
using BussinessLogicTecnoPez.Produccion.Compras;
using BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado;
using System.Transactions;

public partial class Modules_AtencionCliente_Pedido_RegistrarArmadoPedido : System.Web.UI.Page
{
    private const string VIEW_STATE_ID_CLIENTE = "VIEW_STATE_ID_CLIENTE";
    private const string VIEW_STATE_ID_ESTADO = "VIEW_STATE_ID_ESTADO";
    private const string VIEW_STATE_ID_EMPLEADO = "VIEW_STATE_ID_EMPLEADO";
    private const string VIEW_STATE_ID_MONEDA = "VIEW_STATE_ID_MONEDA";
    private const string VIEW_STATE_PRIORIDAD = "VIEW_STATE_PRIORIDAD";
    private const string VIEW_STATE_ENTREGA = "VIEW_STATE_ENTREGA";
    private Cliente VIEW_STATE_CLIENTE
    {
        get
        {
            int idCliente = Convert.ToInt32(ViewState[VIEW_STATE_ID_CLIENTE]);
            Cliente.getManager.ClearFilters();
            Cliente.getManager.AddFilter("IDCLIENTE", GenericManager<Cliente>.filterOperator.Equals, idCliente);
            return Cliente.getManager.GetOne();
        }
    }
    private TipoEstadoPedido VIEW_STATE_ESTADO
    {
        get
        {
            int IdEstado = Convert.ToInt32(ViewState[VIEW_STATE_ID_ESTADO]);
            TipoEstadoPedido.getManager.ClearFilters();
            TipoEstadoPedido.getManager.AddFilter("IDTIPOESTADOPEDIDO", GenericManager<TipoEstadoPedido>.filterOperator.Equals, IdEstado);
            return TipoEstadoPedido.getManager.GetOne();
        }
    }
    private Empleado VIEW_STATE_EMPLEADO
    {
        get
        {
            int IdEmpleado = Convert.ToInt32(ViewState[VIEW_STATE_ID_EMPLEADO]);
            Empleado.getManager.ClearFilters();
            Empleado.getManager.AddFilter("IDEMPLEADO", GenericManager<Empleado>.filterOperator.Equals, IdEmpleado);
            return Empleado.getManager.GetOne();
        }
    }
    private TipoMoneda VIEW_STATE_MONEDA
    {
        get
        {
            int IdMoneda = Convert.ToInt32(ViewState[VIEW_STATE_ID_MONEDA]);
            TipoMoneda.getManager.ClearFilters();
            TipoMoneda.getManager.AddFilter("IDTIPOMONEDA", GenericManager<TipoMoneda>.filterOperator.Equals, IdMoneda);
            return TipoMoneda.getManager.GetOne();
        }
    }
    private DetallePedido SessionDetallePedido
    {
        get { return Session["DetallePedidoArmado"] as DetallePedido; }
        set { Session["DetallePedidoArmado"] = value; }
    }
    private List<StockProducto> Stock
    {
        get { return Session["stockPedido"] as List<StockProducto>; }
        set { Session["stockPedido"] = value; }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            SetMode(PageMode.ListMode);
        }

        InicializarGrilla();

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/package_editors.png";
        master.Titulo = "Registrar Armado de Pedidos";
        _lblError.Text = "";
    }
    private void InicializarGrilla()
    {
        grdPedidos.setupGrid(typeof(Pedido), cargarGrilla, true, true, this.ViewState);

        DataControlField[] controlesExtra = new DataControlField[1];
        ButtonField b = new ButtonField();
        b.CommandName = "DeleteRow";
        //b.Text = "Eliminar";
        b.HeaderText = "Eliminar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        b.ButtonType = ButtonType.Image;

        controlesExtra[0] = b;

        string[] strKeys = new string[1];
        strKeys[0] = "IdProducto";
        grdDetallePedido.DataKeyNames = strKeys;

        grdDetallePedido.setupGrid(typeof(ItemDetallePedido), cargarGrillaProductos, true, false, ViewState, controlesExtra);
    }

    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                mvABM.ActiveViewIndex = 1;
                ddlProducto.Enabled = true;
                txtCantidad.ReadOnly = false;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                break;
            case PageMode.EditMode:
                mvABM.ActiveViewIndex = 1;
                ddlProducto.Enabled = true;
                txtCantidad.ReadOnly = false;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                break;
            case PageMode.ViewMode:
                mvABM.ActiveViewIndex = 1;
                ddlProducto.Enabled = false;
                txtCantidad.ReadOnly = true;
                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                break;
        }
    }

    private void cargarGrilla()
    {
        Pedido.getManager.ClearFilters();
        Pedido.getManager.ClearOrders();
        Pedido.getManager.AddFilter("IDPedido", GenericManager<Pedido>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");
        Pedido.getManager.AddFilter("FECHAARMADO", GenericManager<Pedido>.filterOperator.Equals, null);
        
        if (ViewState[grdPedidos.PageDataViewOrderKey] == null)
        {
            Pedido.getManager.AddOrder("IdPedido", GenericManager<Pedido>.Order.orderDirection.DESC);
        }
        else
        {
            Pedido.getManager.AddOrder(ViewState[grdPedidos.PageDataViewOrderKey].ToString(), (GenericManager<Pedido>.Order.orderDirection)ViewState[grdPedidos.PageDataViewOrdenDireccionKey]);
        }

        List<Pedido> lista = new List<Pedido>();
        lista = Pedido.getManager.GetFilter();
        grdPedidos.DataSource = lista;
        grdPedidos.DataBind();
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        Pedido objPedido = new Pedido();
        objPedido = Pedido.getManager.GetOneByPrimaryKey(lblId.Text);

        if (objPedido == null)
        {
            _lblError.Text = "Error inesperado";
            return;
        }

        objPedido.DetallePedido = SessionDetallePedido;

        using (TransactionScope objScope = new TransactionScope())
        {
            bool blnCambiaEstado = true;
            if (blnCambiaEstado)
            {
                if (objPedido.TipoEntrega == Convert.ToInt32(AppEnums.PedidoTipoEntrega.Envio))
                {
                    TipoEstadoPedido.getManager.ClearFilters();
                    TipoEstadoPedido.getManager.AddFilter("IdTipoEstadoPedido", GenericManager<TipoEstadoPedido>.filterOperator.Equals, Convert.ToInt32(TipoEstadoPedido.TiposEstadosPedidos.PendienteEnviar));
                    objPedido.TipoEstadoPedido = TipoEstadoPedido.getManager.GetOne();
                }
                else
                {
                    TipoEstadoPedido.getManager.ClearFilters();
                    TipoEstadoPedido.getManager.AddFilter("IdTipoEstadoPedido", GenericManager<TipoEstadoPedido>.filterOperator.Equals, Convert.ToInt32(TipoEstadoPedido.TiposEstadosPedidos.Entregado));
                    objPedido.TipoEstadoPedido = TipoEstadoPedido.getManager.GetOne();
                }
            }

            if (!Pedido.getManager.Update(objPedido))
            {
                _lblError.Text = Pedido.getManager.GeneratedException.Message;
                return;
            }

            foreach(StockProducto objStock in this.Stock)
            {
                if (!StockProducto.getManager.Insert(objStock))
                {
                    _lblError.Text = StockProducto.getManager.GeneratedException.Message;
                    return;
                }
            }

            foreach (ItemDetallePedido objItem in objPedido.DetallePedido.ItemList)
            {
                if (!objItem.Armado)
                {
                    blnCambiaEstado = false;
                    break;
                }
            }            
            
            objScope.Complete();
        }
        SetMode(PageMode.ListMode);
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void cmdAgregarDetalle_Click(object sender, EventArgs e)
    {
        DetallePedido objDetalle = SessionDetallePedido;

        if (objDetalle == null)
            return;

        LoteDeFaenamiento objLote;
        try
        {
            LoteDeFaenamiento.getManager.ClearFilters();
            LoteDeFaenamiento.getManager.AddFilter("Codigo", GenericManager<LoteDeFaenamiento>.filterOperator.Equals, txtLote.Text);
            objLote = LoteDeFaenamiento.getManager.GetOne();

            if (objLote == null)
            {
                _lblError.Text = "El código ingresado no corresponde a un lote válido.";
                return;
            }
        }
        catch
        {
            return;
        }
        try
        {
            ItemDetallePedido objItem;
            for (int i = 0; i < objDetalle.ItemList.Count; i++)
            {
                objItem = (ItemDetallePedido)objDetalle.ItemList[i];
                if (objItem.Producto.IdProducto == int.Parse(ddlProducto.SelectedValue))
                {
                    if (objItem.Cantidad >= decimal.Parse(txtCantidad.Text.Trim()))
                    {
                        objItem.CantidadArmada = decimal.Parse(txtCantidad.Text.Trim());
                        //actualizarMovimientoStock(objItem.Insumo, decimal.Parse(txtCantidad.Text.Trim()), DateTime.Now, Convert.ToInt32(txtID.Text));
                        if (objItem.CantidadArmada == objItem.Cantidad)
                            objItem.Armado = true;
                        if (this.Stock == null)
                            this.Stock = new List<StockProducto>();
                        this.Stock.Add(StockProducto.quitarStockDesdePedido(objItem.Producto, objItem.Cantidad, DateTime.Now, Convert.ToInt32(lblId.Text)));
                        objItem.LoteFaenamiento = objLote;
                    }
                    else
                    {
                        _lblError.Text = "La cantidad armada no puede superar a la cantidad pedida.";
                        return;
                    }
                }
                objDetalle.ItemList[i] = objItem;
            }
            SessionDetallePedido = objDetalle;
            cargarGrillaProductos();

            txtCantidad.Text = "";
            _lblError.Text = "";
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void grdPedidos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdPedidos.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }

        if (e.CommandName == "ver")
        {
            int IdPedido = int.Parse(grdPedidos.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            Pedido.getManager.ClearFilters();
            Pedido.getManager.AddFilter("IDPedido", GenericManager<Pedido>.filterOperator.Equals, IdPedido);
            Pedido objPedido = Pedido.getManager.GetOne();

            lblId.Text = objPedido.IdPedido.ToString();
            lblCliente.Text = objPedido.Cliente.ToString();
            ViewState[VIEW_STATE_ID_CLIENTE] = objPedido.Cliente.IdCliente.ToString();
            lblEstado.Text = objPedido.TipoEstadoPedido.ToString();
            ViewState[VIEW_STATE_ID_ESTADO] = objPedido.TipoEstadoPedido.IdTipoEstadoPedido.ToString();
            lblEmpleado.Text = objPedido.Empleado.ToString();
            ViewState[VIEW_STATE_ID_EMPLEADO] = objPedido.Empleado.ToString();
            lblFechaEmision.Text = objPedido.FechaEmision.ToShortDateString();
            lblFechaEntrega.Text = objPedido.FechaEntrega.ToShortDateString();
            lblMoneda.Text = objPedido.TipoMoneda.ToString();
            lblMonto.Text = objPedido.Monto.ToString();
            lblPrioridad.Text = System.Enum.Parse(typeof(AppEnums.PedidoPrioridad), objPedido.Prioridad.ToString(), true).ToString();
            ViewState[VIEW_STATE_PRIORIDAD] = objPedido.Prioridad.ToString();
            lblTipoEntrega.Text = System.Enum.Parse(typeof(AppEnums.PedidoTipoEntrega), objPedido.TipoEntrega.ToString(), true).ToString();
            ViewState[VIEW_STATE_ENTREGA] = objPedido.TipoEntrega.ToString();
            
            this.SessionDetallePedido = objPedido.DetallePedido;
            cargarGrillaProductos();

            SetMode(PageMode.ViewMode);

            ddlProducto.Items.Clear();
            foreach (ItemDetallePedido objItem in objPedido.DetallePedido.ItemList)
            {
                ddlProducto.Items.Add(new ListItem(objItem.Producto.ToString(), objItem.Producto.IdProducto.ToString()));
            }

            txtCantidad.Text = "";
            txtLote.Text = "";
        }
    }
    private void cargarGrillaProductos()
    {
        DetallePedido lista = this.SessionDetallePedido;
        if (lista == null)
            grdDetallePedido.DataSource = null;
        else
            grdDetallePedido.DataSource = lista.ItemList;
        grdDetallePedido.DataBind();
    }
}